home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9302 / HERC2.CD < prev    next >
Text File  |  1995-04-18  |  20KB  |  325 lines

  1.           @VGrafikus konvertálások -- 2.@N
  2.           
  3.           @VMonokróm üzemmód@N
  4.           
  5.           A  megjelenítés  bizonyos  szempontból  egyszerûbb,  mint az
  6.           alkotó  szándékának  ""kitalálgatása",  de több, más jellegû
  7.           nehézséget   rejt  magában.  Elôször  is:  a  megjelenítendô
  8.           információ  többnyire  nem  szürkeárnyalatok  formájában van
  9.           megadva.
  10.           
  11.           
  12.           Színes  információ  esetén a vörös, zöld és kék telítettségi
  13.           tényezôk  különbözô  értékeket vesznek fel, így át kell ôket
  14.           alakítanunk.  Ezek  a tényezôk voltaképpen az adott alapszín
  15.           fényességét  jelzik,  a  három  egyenrangú  alapszín  teljes
  16.           telítettsége   pedig   összeadódva   alkotja   a  legnagyobb
  17.           fényességû   színt,   a  fehéret.  Ezért  például  a  teljes
  18.           telítettségû  vörös  önmagában még csak 255 harmadrészének a
  19.           fényességét  adja,  85-öt. Ha meg akarjuk határozni egy pont
  20.           fényességét,  akkor  tehát  össze  kell adnunk a komponensek
  21.           harmadrészét.   Sokkal  egyszerûbb  azonban  a  @Kfényesség  =@N
  22.           @K(vörös  komponens +  zöld  komponens +  kék  komponens)  / 3@N
  23.           képlet használata.
  24.           
  25.           
  26.            @VA legegyszerûbb módszer@N
  27.           
  28.           Ha  már  elô  tudjuk  állítani  egy pont szürkeségi értékét,
  29.           akkor  megkísérelhetjük  egy  nagyon  gyors,  de  nem túl jó
  30.           minôségû  eljárás  használatát.  Egyszerûen elindulunk a bal
  31.           felsô  sarokból,  és minden pontról eldöntjük, sötétebb vagy
  32.           világosabb-e   a   127-es  félfényességnél.  Elôbbi  esetben
  33.           fekete,   míg   az  utóbbiban  értelemszerûen  fehér  pixelt
  34.           rendelünk  a  fényességértékhez.  Az  algoritmus  meglehetôs
  35.           primitívsége  ritkán  vezet szép képekhez, többnyire piszkos
  36.           vonalrajzokat   és   kifestôkönyvekre   emlékeztetô  ábrákat
  37.           kapunk.    Mégis,    még    ma   is   használják   különbözô
  38.           megjelenítôprogramok,   hiszen   egyszerû  beprogramozni  és
  39.           képcsoportok gyors áttekintéséhez tökéletesen megfelel.
  40.           
  41.           
  42.            @VMerev raszterszórás@N
  43.           
  44.           Ebben  az  eljárásban  minden  egyes, az átviteli file által
  45.           meghatározott   pixelhez   egy  @KX*X@N-es  rasztert  rendelünk.
  46.           Az   @KX@N   nem   lehet   nagy,   érthetôen,   mivel  most  nem
  47.           engedhetjük   meg   az   egymásbacsúszást,  és  a  felbontás
  48.           automatikusan      @K1/X@N-edére      csökken.     Az     @KX*X@N-es
  49.           raszterbe   @KY@N   darab  fehér  pontot  kell  tennünk.  @KY@N  úgy
  50.           aránylik   @KX*X@N-hez,   mint   a   számolt   fényességérték  a
  51.           255-höz:   @KY   =   (X*X)   *   (fényesség   /   255)@N.  Az  @KY@N
  52.           számú  pontot  a  lehetô  legelszórtabban  kell elhelyezni a
  53.           raszteren  belül,  hogy az minél homogénebb hatást nyújtson.
  54.           Az  elszórtságra  nemcsak a raszteren belül kell figyelnünk,
  55.           hanem  az  egymás  melletti  azonos raszterek viszonylatában
  56.           is.  Elsô  ábránk  néhány  tippet  mutat  be az elrendezésre
  57.           2*2-es és 3*3-as raszterekben.
  58.           
  59.           Ez   az  eljárás  valamivel  jobb  képeket  készít,  mint  a
  60.           közelítô     színválasztás,    mégis,    több    szempontból
  61.           kívánnivalókat  hagy  maga  után.  A  felbontás  csökkentése
  62.           megbocsáthatatlan  bûnnek  tûnik,  ráadásul  elkerülhetô.  A
  63.           kifejezhetô  szürkeárnyalatok száma viszonylag kicsi: 2*2-es
  64.           rasztereknél   5,   3*3-asoknál   10   különbözô   fényesség
  65.           lehetséges.  Mindezek  miatt  ez  az  algoritmus  sem igazán
  66.           alkalmas élvezhetô képek elôállítására.
  67.           
  68.           
  69.            @VRelatív címzésû raszterszórás@N
  70.           
  71.           Elôször  növeljük  meg  az árnyalatok számát, mondjuk 65-re.
  72.           Ez   8*8-as   rasztert  feltételez,  egyelôre  ezzel  fogunk
  73.           dolgozni.   Tervezzük   meg  a  65  árnyalathoz  tartozó  65
  74.           különbözô  rasztert.  Értelemszerûen minden lépésnél további
  75.           egy  fehér  pontot kell elhelyeznünk a 8*8-as mezôben akkor,
  76.           ha  a feketétôl indultunk és egyesével haladunk a fehér felé
  77.           (így a legegyszerûbb).
  78.           
  79.           Egy   pont   helyének   kiválasztásakor   mindig  arra  kell
  80.           figyelnünk,  hogy  az  a  lehetô  legtávolabb  legyen  a már
  81.           meglévô  többi fehér ponttól a raszteren belül, és az egymás
  82.           mellé  helyezett  ugyanilyen  raszterekben  is.  Ha tehát az
  83.           elsô  pontot  a  bal  felsô  sarokba  (0;0)  tettük, akkor a
  84.           következôt  nem rakhatjuk a jobb alsó sarokba (7;7) mivel ez
  85.           a  pont  a  sarkával  érintkezne  a rasztertôl jobbra lefelé
  86.           lévô,  ugyanilyen  raszter  bal  felsô pixelével. Elôfordul,
  87.           hogy  már  annyira tele van a raszter, hogy a következô pont
  88.           mindenképpen  érintkezni  fog egy vagy több ponttal. Fontos,
  89.           hogy  a  sarkaikkal  illetve  lapjaikkal  érintkezô  pixelek
  90.           távolsága   eltér:   ha   két,  lapjával  érintkezô  képpont
  91.           középpontja   egységnyi   távolságú,   akkor   a   sarkukkal
  92.           érintkezô   képpontok  közepe  négyzetgyök  2  egységre  van
  93.           egymástól.   Persze   az  sem  mindegy,  hogy  hány  ponttal
  94.           érintkezne a következô pixel: minél kevesebbel, annál jobb.
  95.           
  96.           Egy  ekkora  rasztert  még  kézzel is meg lehet tervezni, de
  97.           aki  szeret programozgatni, annak azt ajánlom, készítsen egy
  98.           64  elemû tömböt. Egy dupla ciklussal tapogassuk le a teljes
  99.           8*8-as  mezôt,  minden  fehér  pontból induljunk el mind a 8
  100.           irányba  (jobbra,  balra,  le, föl és a köztes irányokba), s
  101.           átlagoljuk,  hogy  a  legközelebbi fehér pontok milyen távol
  102.           vannak  az  adott  képelemtôl  --  a négy fôirányban 1-es, a
  103.           négy  átlós  irányban  pedig  1,41-os  szorzót alkalmazva. A
  104.           már  fehér elemeket eleve ki kell zárni a lehetôségek közül.
  105.           A  végén válasszuk ki a 64 átlagból a legnagyobbat. Ide kell
  106.           kerülnie   a  következô  képelemnek.  Ez  így  megy  egészen
  107.           félfényességig,  31-ig.  Innen  fordítva kell tovább haladni
  108.           65-ig,   a  teljes  fényességig.  Csak  a  fekete  pontokkal
  109.           dolgozunk,  a  fekete pontoktól vett távolságokat figyeljük,
  110.           s  az átlagok közül mindig a legkisebbet kell kiválasztanunk
  111.           -- ott lesz a következô fehér pont.
  112.           
  113.           Fontos,  hogy  két  szomszédos  fényességértékû raszter csak
  114.           egyetlen  pontban  különbözhet  egymástól.  A  23-as raszter
  115.           például  maximum  egy  plusz  pixelt tartalmazhat a 22-eshez
  116.           képest,  a  többi  22 pixelt nem rendezhetjük át a raszteren
  117.           belül.    Enélkül    nagyon    csúf   fényességi   gócpontok
  118.           alakulhatnak   ki   a  képernyôn  két  különbözô  fényességû
  119.           raszter  találkozásánál.  A második ábra szemlélteti, hogyan
  120.           célszerû megoldani az elrendezést.
  121.           
  122.           Most  már  elég  árnyalatunk  van,  oldjuk  meg  a felbontás
  123.           problémáját   is.   Ha   egyszerûen  hozzárendelnénk  8*8-as
  124.           raszterünket  a  kapott fényességértékhez, akkor 1/8 részére
  125.           csökkenne ez a fontos jellemzô -- ami megengedhetetlen.
  126.           
  127.           Próbáljuk  ki a következôt. A képernyôt gondolatban hálózzuk
  128.           be  egy  négyzetráccsal  úgy,  hogy minden nyolcadik pixelre
  129.           essen  egy  fonál.  Feleltessük  meg  a  négyzetrács  minden
  130.           rácspontját  a  8*8-as  raszterünk bal felsô sarkának. Ezt a
  131.           méretbeli  azonosság  miatt  nyugodtan  megtehetjük.  Most a
  132.           képernyô  minden  egyes fizikai pontjáról el tudjuk dönteni,
  133.           hogy  vízszintes  és függôleges irányban milyen messze van a
  134.           rácsponttól,   vagyis   a   megtervezett  raszterünk  melyik
  135.           pixelére esik (lásd a harmadik ábrát).
  136.           
  137.           Módosítsuk  úgy  a raszterképzô eljárásunkat, hogy határozza
  138.           meg  minden  egyes  pont helyét az adott raszteren belül. Ha
  139.           nehézségeink  adódnának,  akkor  az  @KX1  =  X  mod 8@N és @KY1 =@N
  140.           @KY   mod   8@N  képletekkel   próbálkozhatunk,  ahol   @KX@N  és  @KY@N
  141.           a    fizikai    cím,    @KX1@N   és   @KY1@N   a   raszteren   belül
  142.           koordináta,   a   @Kmod@N  pedig  egy  egész  számokkal  dolgozó
  143.           osztás,  amely  mindig  lefelé  kerekít  és  eredményként az
  144.           osztás maradékát adja vissza.
  145.           
  146.           Ha  egy  adott  rácson  belül  mind  a  64  pontnak azonos a
  147.           fényessége  --  az (X;Y) pontról pedig úgy döntjük el fekete
  148.           vagy  fehér voltát, hogy meghatározzuk raszterbeli helyét és
  149.           az  ehhez  tartozó  értéket  kiolvassuk  a kívánt fényességû
  150.           raszterbôl  --,  akkor az adott rácsban fizikailag megjelenô
  151.           ponthalmaz  megegyezik  majd  a  kívánt  fényességû  raszter
  152.           mátrixhalmazával,  a megfelelô árnyalatot hozva létre ezzel.
  153.           Ha  egy  adott rács pixeleinek nem azonos a fényességértéke,
  154.           akkor  a  8*8-as  mezôn belüli relatív pozíció meghatározása
  155.           után  azon  raszter  megfelelô pontját kell kiolvasni, amely
  156.           leginkább    kifejezi    az   ábrázolandó   képpont   kívánt
  157.           fényességét.    Azt,    hogy    milyen    rasztereket   kell
  158.           felhasználnunk,    egy    egyszerû    képlet    segítségével
  159.           kitalálhatjuk:  @Kraszter  =  max  raszterek  *  (fényesség  /@N
  160.           @K255)@N.
  161.           
  162.           A  relatív  címzés trükkjének felhasználásával elértük, hogy
  163.           egy    adott   rasztermezôn   belül   megfelelô   élességgel
  164.           ábrázolhassunk   fényességi   határokat,  ezen  túl  viszont
  165.           megtarthassuk  az átmeneti árnyalatok és a homogén felületek
  166.           egyenletességét.  A  legfontosabb,  hogy  az eljárással most
  167.           már   fizikai   pixelekre  címezhetünk,  akár  64  különbözô
  168.           fényességértéket  megadva  a  háló  adott  rácsán  belül. Az
  169.           elôre  elkészített raszterek gondoskodnak arról, hogy mindez
  170.           a lehetô legpontosabban jelenjen meg a képernyôn.
  171.           
  172.           îgy  már van 65 különbözô szürkeárnyalatunk, és a felbontást
  173.           is  megôriztük.  Mielôtt elbíznánk magunkat és a jól végzett
  174.           munka  törékeny illúziójának kártékony hatása alá kerülnénk,
  175.           rá  kell  jöjjünk, a módszer korántsem tökéletes. Az eljárás
  176.           viszonylag  szép  képeket  készít  ugyan, mégis van egy apró
  177.           hibája.   Ez   pedig   a   mátrixok  fénycsíkjainak  vonalba
  178.           rendezôdése.  Ez  a  vonalba rendezôdés azért következik be,
  179.           mert  a  raszterek  tervezése  során  végig arra figyeltünk,
  180.           hogy  a  lehetô  legtávolabb  kerüljenek egymástól az azonos
  181.           színû  pontok.  Emiatt  a  szigorú  matematikai pontossággal
  182.           elrendezett  pixelek  az  emberi  szemben egyenes vonalakká,
  183.           szimmetrikus  mértani  formákká  olvadnak  össze, lerontva a
  184.           homogén hatást.
  185.           
  186.           
  187.            @VTovábbfejlesztett raszterszórás@N
  188.           
  189.           A  raszterek  megtervezését  kell tehát módosítani úgy, hogy
  190.           kiküszöböljük  a  vonalhatást.  Most már nem úszhatjuk meg a
  191.           programozást.  Az  elvégzendô mûveletsor oly összetett, hogy
  192.           a  ""találomra"  végzett  kézi  tervezés  alighanem  totális
  193.           csôdhöz  vezet.  Ha  nem  voltunk  lusták  megírni  az  elsô
  194.           rasztertípus   tervezô   algoritmusát,  akkor  mázlink  van.
  195.           Néhány módosítással elintézhetjük a dolgot.
  196.           
  197.           Elôször   is,   a   letapogatás   során   nemcsak  azt  kell
  198.           megállapítani   minden   egyes   pozícióról,   hogy   milyen
  199.           átlagtávolságra  vannak  a  legközelebbi  pixelek, hanem azt
  200.           is,  hogy  a  négy  fô- és a négy átlós irányban hány azonos
  201.           színû   pixellel   esne   egy  vonalba  az  adott  pozícióra
  202.           helyezendô  képelem  8 egységen belül. Ha a számlálás közben
  203.           kicsúszunk  a  raszter  területérôl, akkor térjünk vissza az
  204.           ellentétes  oldal  megfelelô  eleménél.  Ezek  szerint össze
  205.           kell  adni  azoknak  az  azonos  színû  pixeleknek a számát,
  206.           amelyek  8  egység  távolságon  belül  rajta vannak azon a 4
  207.           félegyenesen,  amelyek  a  vizsgált  pixelbôl  indulnak ki a
  208.           négy fô- és a négy átlós irányba.
  209.           
  210.           Most  jön a döntô különbség: a 64 elembôl nem azt választjuk
  211.           ki,    amelyiknél    a    legnagyobb   az   azonos   pixelek
  212.           átlagtávolsága,  hanem azt/azokat, ahol a legkevesebb azonos
  213.           színû  pixellel esne egy vonalba az új pixel. Persze ha több
  214.           ilyen  helyet  is találunk, akkor ezekbôl azt választjuk ki,
  215.           amelyiknél   a   legnagyobb   az  átlagtávolság.  A  módszer
  216.           félfényességnél  itt  is  átvált,  akárcsak  az elsô tervezô
  217.           algoritmus:  a  fekete  pixeleket figyeli, és fordítva veszi
  218.           figyelembe az eredményeket.
  219.           
  220.           Ha  jól  írtuk  meg az eljárást, akkor már alighanem az elsô
  221.           próbálkozások  is felülmúlhatatlan sikerélményt jelentenek a
  222.           felkészületlen   programozó   számára.  A  még  igényesebbek
  223.           belevághatnak    a    16*16-os    és    32*32-es   raszterek
  224.           kidolgozásába.  Minden  ugyanúgy  mûködik, csak a konstansok
  225.           nônek  kétszeresükre, illetve csökkennek felére a funkciótól
  226.           függôen.
  227.           
  228.           
  229.            @VEgydimenziós hibaszórás@N
  230.           
  231.           Ez  a  módszer teljesen más elvet követ, mint az elôzôk, így
  232.           a   vele   készített   képek   is   jelentôsen   eltérnek  a
  233.           megszokottól.  Furcsa  sajátosság,  hogy  a  módszer  a  kép
  234.           készítése  közben fellépô hibák -- ábrázolási pontatlanságok
  235.           --  felhalmozódására épít, és ezeket az eltéréseket próbálja
  236.           kompenzálni  minden  egyes  új  pixel  felhordásánál. A hiba
  237.           akkor  keletkezik,  amikor  a  kívánt  árnyalatot  nem lehet
  238.           kifejezni  egy  mátrix  segítségével, azaz szinte állandóan.
  239.           Ha  csak  fekete  és  fehér  színekkel  rendelkezünk,  akkor
  240.           bármely  köztes árnyalat kifejezésekor pontatlanság lép fel,
  241.           ezt pedig elôbb-utóbb korrigálni kell.
  242.           
  243.           Ha   elsôként   egy   közel   negyedfényességû  pixelt  kell
  244.           kiraknunk  (60-as fényesség), akkor értelemszerûen a feketét
  245.           választjuk,  hiszen az a kívánt árnyalathoz legközelebb lévô
  246.           ""valódi"   szín.   Máris  megjelenik  a  hiba,  hiszen  nem
  247.           negyedfényességet  fejeztünk  ki, hanem teljes sötétséget. A
  248.           hiba  súlyossága  az  eltéréssel  arányos,  ezért azt így is
  249.           jegyezzük  fel.  Ha  a  következô pixel is 60-as fényességû,
  250.           mi  ismét fekete pixelt választunk, még egyszer elkövetve az
  251.           elôbbi  pontatlanságot.  Most  már  kétszer  olyan  súlyos a
  252.           hiba.   Ha   azt  akarjuk,  hogy  ez  az  árnyalati  tévedés
  253.           megszûnjön,  akkor  a  felhalmozódott hibát valahogy be kell
  254.           csempésznünk   a   pixelszín   eldöntésének  a  folyamatába.
  255.           Kézenfekvônek  tûnik,  hogy minden lépésnél összeadogatjuk a
  256.           keletkezô  pontatlanságokat,  és  az  összeget  megpróbáljuk
  257.           ""jóváírni" a következô mátrixpont bejövô alapértékén.
  258.           
  259.           A  hibaszórásos  algoritmus  egydimenziós változata pontosan
  260.           ezt  teszi.  Fenntart  egy hibaváltozót, amiben azt tárolja,
  261.           mekkora  eltérést  kellene  korrigálni az adott pillanatban,
  262.           és  ezt  a változót mindig módosítja annak megfelelôen, hogy
  263.           többet,   avagy   kevesebbet  fejezett  ki  a  kívántnál.  A
  264.           hibaváltozó  értéke  lehet  negatív  is. Ez akkor következik
  265.           be,  ha  a kifejezendô árnyalat a félfényességen felül volt,
  266.           de még nem érte el a fehér szintjét.
  267.           
  268.           A  pontatlanság  ""jóváírása"  úgy  történik,  hogy az éppen
  269.           kifejezendô  fényességhez  hozzáadjuk a hibaváltozó értékét.
  270.           Ha  a  mátrixpont  így  átbillen  feketébôl  fehérbe -- vagy
  271.           fordítva   --,   akkor   a   korrekció   megtörtént.   Talán
  272.           túlságosan  is  --  újabb hiba, ezúttal ellenkezô elôjellel.
  273.           Természetesen  a  hibaváltozó  kezdôértéke nulla, s amíg nem
  274.           követünk el hibát, nincs mit korrigálni.
  275.           
  276.           Nem  kell  semmi  mást  tennünk,  mint hogy elindulunk a kép
  277.           egyik  sarkából,  és  pixelenként,  sorfolytonosan  -- ettôl
  278.           egydimenziós   az   eljárás   --  végrehajtjuk  a  következô
  279.           bekezdés mûveletsorát.
  280.           
  281.           Lekérjük  az  ábrázolandó  pixel  eredeti  fényességértékét.
  282.           Ehhez  hozzáadjuk a hibaváltozót (ez kivonást is jelenthet).
  283.           Errôl  a  korrigált fényességértékrôl eldöntjük, hogy fehér,
  284.           avagy  fekete  pixelt  igényel  --  félfényesség felett vagy
  285.           alatt  van-e.  Kirakjuk  a  képernyôre a szükséges mátrixot,
  286.           végül  a hibaváltozóhoz hozzáadjuk az eredeti fényességérték
  287.           és  a  képernyôre  küldött  pixel fényességértékének (0 vagy
  288.           255)  a  különbségét.  Képlettel:  @Khiba  =  hiba  + (eredeti@N
  289.           @Kérték   -  mátrix   fényesség)@N.   A   képernyôsorok   elején
  290.           nullázhatjuk  a  hibaváltozót,  de  nem ajánlatos. Többnyire
  291.           nem   túl   zavaróak   az  átcsúszott  korrekciós  mátrixok,
  292.           ellenben  a  raszterpontok jóval szétszórtabban helyezkednek
  293.           majd el egymás alatt, kellemes homogén hatást nyújtva.
  294.           
  295.           Természetesen   a   hibaszórásos   algoritmusnak  is  vannak
  296.           fejlettebb,  rendkívül  bonyolult  és idôigényes változatai.
  297.           Ez  a  verzió  gyors,  viszonylag  egyszerû,  és  az  esetek
  298.           többségében  gyönyörû  képeket hoz létre. Ha nem láttunk még
  299.           hasonló  algoritmussal  létrehozott,  tetszetôs  árnyaltságú
  300.           raszterábrákat,  akkor  aligha akarjuk majd elhinni: hûséges
  301.           monokróm   monitorunk  még  mindig  a  jó  öreg  720*348-as,
  302.           kétszínû üzemmódban villódzik.
  303.           
  304.           Noha  az  eljárások  elsôsorban  arra  valók, hogy az eltérô
  305.           üzemmódok  között  szabad átjárást biztosítsanak a különbözô
  306.           képek  számára, akik figyeltek, alighanem rájöttek már, hogy
  307.           az  alkalmazási  terület  ennél  jóval  szélesebb.  Például:
  308.           képzeljük  el,  hogy  van egy igen fontos monokróm képünk --
  309.           pocsék  ábrázolással.  Alakítsuk  át köztes file formájába a
  310.           legjobb  algoritmus segítségével. Ezután az eredetit akár ki
  311.           is   dobhatjuk,  csak  a  köztes  file-ra  lesz  szükségünk.
  312.           Válasszuk  ki  a legszebb eljárást a megjelenítési technikák
  313.           közül,  és  rakjuk  vissza  a  képet az eredeti üzemmódba --
  314.           csak  most  már a köztes file-ból dolgozva, és százszor jobb
  315.           minôségben.  A  keletkezett kép alighanem klasszisokkal jobb
  316.           lesz, mint az eredeti.
  317.           
  318.           Sorozatunk  következô  részében a CGA és az EGA megjelenítôk
  319.           lehetôségeit  firtatjuk  majd.  A  VGA sem marad ki, mivel a
  320.           hétköznapi  halandó számára egyelôre elérhetetlen XGA után a
  321.           második  helyet foglalja el a grafikát kedvelôk népszerûségi
  322.           listáján. Ez azonban külön fejezetet érdemel.
  323.           
  324.           @KNagy Gergely@N
  325.